#include <iostream>
#include <memory>
#include <ctime>
#include <vector>
#include <unordered_map>
#include "TcpServerSocket.hpp"
#include "Connection.hpp"
#include "SwordServer.hpp"
#include "IOHandler.hpp"
#include "RoomPlayers.hpp"
using namespace std;

// 直接关闭窗口时准备字段应该被消除，加入房间时应该知道各个成员的准备情况

std::unique_ptr<ServerManager> server_manager = std::make_unique<ServerManager>();
// 游戏倒计时初始化;
double g_countdown = 0;
unordered_map<std::string, Room*> rooms;
unordered_map<int, std::string> fd_to_room_number; // 建立文件描述符与房间号的映射

// 在创建房间时根据房间人数来初始化它
std::vector<std::vector<int>> _battlefield_rgb(window_height / block_size, std::vector<int>(window_width / block_size)); // 场地及其携带的颜色

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        cout << "Errno: " << argv[0] << " port" << endl;
        return 1;
    }

    srand((unsigned)time(nullptr));
    // 初始化listen套接字
    uint16_t port = stoi(argv[1]);
    unique_ptr<TcpServerSocket> _listensock = make_unique<TcpServerSocket>();
    _listensock->Init(port);
    // 设置listensock 为非阻塞
    cout << "_listensock->GetFd(): " << _listensock->GetFd() << endl;
    SetNonBlock(_listensock->GetFd());

    // 初始化 Reactor
    unique_ptr<Reactor> svr = make_unique<Reactor>();
    svr->Init();

    // 创建连接为监听套接字的连接对象
    Connection* listenconn = Factory::BuildListenConn(_listensock->GetFd(), EPOLLIN | EPOLLET, Accept, svr.get());
    // 将监听连接对象添加到Reactor中
    svr->AddConnection(listenconn, listenconn->GetEvent());

    
    // 初始化server_manager
    server_manager->Init();

    svr->Dispatch();

    server_manager->Destory();
    return 0;
}


// #include <iostream>
// #include <string>
// #include <unistd.h>
// #include <sys/types.h>
// #include <sys/socket.h>
// #include <netinet/in.h>
// #include <arpa/inet.h>
// using namespace std;

// #include "RequestResponse/Protocol.hpp"
// #include "RequestResponse/CreateRoom.hpp"
// #include "RequestResponse/ServerManager.hpp"
// // 远端创建房间和解散房间、开始游戏，以及加入房间，退出房间、准备、取消准备
// // 同步玩家的操作

// int main(int argc, char *argv[])
// {
//     if (argc != 2)
//     {
//         cout << "Errno: " << argv[0] << " port" << endl;
//         return 1;
//     }

//     int listensock = socket(AF_INET, SOCK_STREAM, 0);

//     int opt = 1;
//     setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));

//     if (listensock < 0)
//     {
//         return 1;
//     }

//     uint16_t port = stoi(argv[1]);

//     struct sockaddr_in addr;
//     addr.sin_family = AF_INET;
//     addr.sin_addr.s_addr = INADDR_ANY;
//     addr.sin_port = htons(port);
//     int n = bind(listensock, (struct sockaddr *)(&addr), sizeof(addr));
//     if (n < 0)
//     {
//         return 1;
//     }

//     n = listen(listensock, 5);

//     while (true)
//     {
//         struct sockaddr_in peeraddr;
//         socklen_t len = sizeof(peeraddr);
//         int newsock = accept(listensock, (struct sockaddr *)(&peeraddr), &len);

//         unique_ptr<ServerManager> server_manager = make_unique<ServerManager>();
//         server_manager->Init();

//         if (newsock > 0)
//         {
//             cout << "newsock: " << newsock << endl;

//             while (true)
//             {
//                 char buffer[1024];
//                 int ret = recv(newsock, buffer, sizeof(buffer) - 1, 0);
//                 if (ret > 0)
//                 {
//                     bool ok = true;
//                     buffer[ret] = 0;
//                     cout << "client# " << buffer << endl;
//                     string msg = buffer;
//                     Unpackage(msg, &msg);
//                     string result = server_manager->GetRequsestAndResponse(msg, &ok);
//                     if (ok)
//                     {
//                         Package(result, &result);
//                         ret = send(newsock, result.c_str(), result.size(), 0);
//                         cout << "server# " << result << endl;
//                     }
//                     else
//                     {
//                         cout << "Unpackge faild" << endl;
//                     }
//                 }
//                 else if (ret == 0)
//                 {
//                     cout << "对端关闭" << endl;
//                     close(newsock);
//                     break;
//                 }
//                 else
//                 {
//                     cout << "recv failed" << endl;
//                     close(newsock);
//                     break;
//                 }
//             }
//         }
//     }

//     return 0;
// }